/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * ReasignarContactoAPaciente.java
 *
 * Created on 29-oct-2010, 15:56:22
 */

package presentacion.persona;

import hibernate.objeto.Paciente;
import hibernate.objeto.Persona;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.RowFilter;
import javax.swing.table.TableRowSorter;
import logica.CapaLogica;
import logica.PacienteLogica;
import logica.PersonaLogica;
import presentacion.CapaPresentacion;
import presentacion.utilidad.PopUpMenu;
import presentacion.comun.ComunPersonaPresentacion;
import presentacion.utilidad.maquetado.Fuente;
import presentacion.utilidad.maquetado.Icono;
import presentacion.utilidad.maquetado.InformeError;
import presentacion.utilidad.tabla.CustomRenderer;
import presentacion.utilidad.MensajePresentacion;
import presentacion.utilidad.tabla.MiModeloTabla;

/**
 *
 * @author Administrador
 */
public class ReasignarContactoAPacientePresentacion extends javax.swing.JDialog {

    /** Creates new form ReasignarContactoAPaciente */
    public ReasignarContactoAPacientePresentacion(java.awt.Frame parent, boolean modal,
            Persona persona) {
        super(parent, modal);
        initComponents();

        personaAModificar = persona;
        reasignacionExitosa = false;

        setSize(CapaPresentacion.getTamañoMaximoJDialog());
        setLocationRelativeTo(null);
        personalizarJDialog();
        setearEventosQueCapturanTeclaEnterYEscape();
    }

    /**
     * Setea datos de la ventana.
     *
     */
    private void personalizarJDialog() {
        this.setTitle("Reasignación de contactos para pacientes");
        textoDescriptivoVentana.setText("Persona que afecta a los pacientes y "
                + "será eliminada: " +
                CapaPresentacion.imprimirApellidoYNombrePersona(personaAModificar));

        //Carga la tabla de personas disponibles
        MiModeloTabla.cargarTablaPersona(
                PersonaLogica.getVectorPersonaMayorDeEdadYEnBd(), tablaPersona);

        //Carga la tabla de pacientes afectados
        MiModeloTabla.cargarTablaPaciente(
                PacienteLogica.getVectorPacientePorIdContacto(
                personaAModificar.getIdPersona()), tablaPaciente);

        inicializarMatriz();
    }
    
    /**
     * Inicializa la matriz.
     *
     */
    private void inicializarMatriz() {
        datosReasigancion = new Object[tablaPaciente.getRowCount()][5];
        for (int i = 0; i < datosReasigancion.length; i++) {
            int idPaciente =
                    Integer.valueOf(tablaPaciente.getModel().getValueAt(i, 0).toString()).intValue();
                    Paciente paciente = PacienteLogica.getPacientePorId(idPaciente);

            datosReasigancion
                    [i][CapaLogica.REASIGNACION_CONTACTO_OBJETO_PACIENTE] =
                    paciente;
            datosReasigancion
                    [i][CapaLogica.REASIGNACION_CONTACTO_VINCULO_PERSONA_DE_CONTACTO] =
                    "";
            datosReasigancion
                    [i][CapaLogica.REASIGNACION_CONTACTO_OBJETO_PERSONA_DE_CONTACTO] =
                    null;
            datosReasigancion
                    [i][CapaLogica.REASIGNACION_CONTACTO_OBJETO_TUTOR] =
                    null;
            datosReasigancion
                    [i][CapaLogica.REASIGNACION_CONTACTO_ES_VALIDO] = "true";
        }
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        panelPacientesAfectados = new javax.swing.JPanel();
        tablaPacienteScrollPane = new javax.swing.JScrollPane();
        tablaPaciente = new javax.swing.JTable(new MiModeloTabla());
        textoFiltrarTablaPaciente = new javax.swing.JLabel();
        filtrarTablaPaciente = new javax.swing.JTextField();
        textoDescriptivoVentana1 = new javax.swing.JLabel();
        panelPersonaResponsable = new javax.swing.JPanel();
        panelPersonaDeContacto = new javax.swing.JPanel();
        textoDocumentoPersonaDeContacto = new javax.swing.JLabel();
        textoApellidoYNombrePersonaDeContacto = new javax.swing.JLabel();
        textoVinculoPersonaDeContacto = new javax.swing.JLabel();
        vinculoPersonaDeContacto = new javax.swing.JComboBox();
        documentoPersonaDeContacto = new javax.swing.JLabel();
        apellidoYNombrePersonaDeContacto = new javax.swing.JLabel();
        panelTutor = new javax.swing.JPanel();
        textoDocumentoTutor = new javax.swing.JLabel();
        textoApellidoYNombreTutor = new javax.swing.JLabel();
        documentoTutor = new javax.swing.JLabel();
        apellidoYNombreTutor = new javax.swing.JLabel();
        botonSeleccionarPersonaDeContacto = new javax.swing.JButton();
        botonSeleccionarTutor = new javax.swing.JButton();
        tablaPersonaScrollPanel = new javax.swing.JScrollPane();
        tablaPersona = new javax.swing.JTable(new MiModeloTabla());
        textoFiltrarTablaPersona = new javax.swing.JLabel();
        filtrarTablaPersona = new javax.swing.JTextField();
        botonAgregarPersona = new javax.swing.JButton();
        textoDescriptivoPanelContacto = new javax.swing.JLabel();
        botonReasignar = new javax.swing.JButton();
        botonCancelar = new javax.swing.JButton();
        textoDescriptivoVentana = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        panelPacientesAfectados.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Pacientes afectados", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, Fuente.FUENTE_PANEL_BORDE));
        panelPacientesAfectados.setForeground(Fuente.COLOR_NORMAL);
        panelPacientesAfectados.setPreferredSize(new java.awt.Dimension(1004, 313));

        tablaPacienteScrollPane.setPreferredSize(new java.awt.Dimension(972, 244));

        tablaPaciente.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                tablaPacienteMouseReleased(evt);
            }
        });
        tablaPaciente.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                tablaPacienteKeyReleased(evt);
            }
        });
        tablaPacienteScrollPane.setViewportView(tablaPaciente);
        MiModeloTabla.inicializarTabla(tablaPaciente);
        tablaPaciente.getTableHeader().setEnabled(false);

        textoFiltrarTablaPaciente.setFont(Fuente.FUENTE_LABEL);
        textoFiltrarTablaPaciente.setForeground(Fuente.COLOR_NORMAL);
        textoFiltrarTablaPaciente.setText("Filtrar");
        textoFiltrarTablaPaciente.setPreferredSize(new java.awt.Dimension(28, 20));

        filtrarTablaPaciente.setFont(Fuente.FUENTE_TEXTFIELD);
        filtrarTablaPaciente.setForeground(Fuente.COLOR_NORMAL);
        filtrarTablaPaciente.setToolTipText("Filtra los datos encontrados por algún criterio");
        filtrarTablaPaciente.setPreferredSize(new java.awt.Dimension(200, 20));
        filtrarTablaPaciente.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                filtrarTablaPacienteKeyReleased(evt);
            }
        });

        textoDescriptivoVentana1.setFont(Fuente.FUENTE_TITULO_3);
        textoDescriptivoVentana1.setForeground(Fuente.COLOR_NORMAL);
        textoDescriptivoVentana1.setText("Seleccione el paciente y luego asocie la nueva persona de contacto y/o tutor");
        textoDescriptivoVentana1.setPreferredSize(new java.awt.Dimension(730, 20));

        javax.swing.GroupLayout panelPacientesAfectadosLayout = new javax.swing.GroupLayout(panelPacientesAfectados);
        panelPacientesAfectados.setLayout(panelPacientesAfectadosLayout);
        panelPacientesAfectadosLayout.setHorizontalGroup(
            panelPacientesAfectadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPacientesAfectadosLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelPacientesAfectadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(tablaPacienteScrollPane, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(panelPacientesAfectadosLayout.createSequentialGroup()
                        .addComponent(textoDescriptivoVentana1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(textoFiltrarTablaPaciente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(filtrarTablaPaciente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        panelPacientesAfectadosLayout.setVerticalGroup(
            panelPacientesAfectadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelPacientesAfectadosLayout.createSequentialGroup()
                .addGroup(panelPacientesAfectadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(textoDescriptivoVentana1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(panelPacientesAfectadosLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                        .addComponent(filtrarTablaPaciente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(textoFiltrarTablaPaciente, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(tablaPacienteScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 249, Short.MAX_VALUE)
                .addContainerGap())
        );

        panelPersonaResponsable.setBorder(javax.swing.BorderFactory.createTitledBorder(null, "Persona Responsable", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, Fuente.FUENTE_PANEL_BORDE));
        panelPersonaResponsable.setForeground(Fuente.COLOR_NORMAL);
        panelPersonaResponsable.setPreferredSize(new java.awt.Dimension(1004, 319));

        panelPersonaDeContacto.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createTitledBorder("Persona de Contacto"), "", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, Fuente.FUENTE_PANEL_BORDE));
        panelPersonaDeContacto.setForeground(Fuente.COLOR_NORMAL);
        panelPersonaDeContacto.setPreferredSize(new java.awt.Dimension(199, 241));

        textoDocumentoPersonaDeContacto.setFont(Fuente.FUENTE_LABEL);
        textoDocumentoPersonaDeContacto.setText("Documento");

        textoApellidoYNombrePersonaDeContacto.setFont(Fuente.FUENTE_LABEL);
        textoApellidoYNombrePersonaDeContacto.setText("Apellido, Nombre");

        textoVinculoPersonaDeContacto.setFont(Fuente.FUENTE_LABEL);
        textoVinculoPersonaDeContacto.setText("Relación");
        textoVinculoPersonaDeContacto.setPreferredSize(new java.awt.Dimension(95, 15));

        vinculoPersonaDeContacto.setModel(CapaPresentacion.getListaDeVinculoPersonaDeContacto());
        vinculoPersonaDeContacto.setEnabled(false);
        vinculoPersonaDeContacto.setPreferredSize(new java.awt.Dimension(169, 20));
        vinculoPersonaDeContacto.addItemListener(new java.awt.event.ItemListener() {
            public void itemStateChanged(java.awt.event.ItemEvent evt) {
                vinculoPersonaDeContactoItemStateChanged(evt);
            }
        });

        documentoPersonaDeContacto.setFont(Fuente.FUENTE_LABEL);
        documentoPersonaDeContacto.setForeground(Fuente.COLOR_NORMAL);
        documentoPersonaDeContacto.setPreferredSize(new java.awt.Dimension(169, 20));

        apellidoYNombrePersonaDeContacto.setFont(Fuente.FUENTE_LABEL);
        apellidoYNombrePersonaDeContacto.setForeground(Fuente.COLOR_NORMAL);
        apellidoYNombrePersonaDeContacto.setPreferredSize(new java.awt.Dimension(169, 20));

        javax.swing.GroupLayout panelPersonaDeContactoLayout = new javax.swing.GroupLayout(panelPersonaDeContacto);
        panelPersonaDeContacto.setLayout(panelPersonaDeContactoLayout);
        panelPersonaDeContactoLayout.setHorizontalGroup(
            panelPersonaDeContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelPersonaDeContactoLayout.createSequentialGroup()
                .addGroup(panelPersonaDeContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(textoVinculoPersonaDeContacto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(vinculoPersonaDeContacto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(textoDocumentoPersonaDeContacto)
                    .addComponent(textoApellidoYNombrePersonaDeContacto)
                    .addGroup(panelPersonaDeContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addComponent(apellidoYNombrePersonaDeContacto, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(documentoPersonaDeContacto, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap())
        );
        panelPersonaDeContactoLayout.setVerticalGroup(
            panelPersonaDeContactoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelPersonaDeContactoLayout.createSequentialGroup()
                .addComponent(textoVinculoPersonaDeContacto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(vinculoPersonaDeContacto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(textoDocumentoPersonaDeContacto)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(documentoPersonaDeContacto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(textoApellidoYNombrePersonaDeContacto)
                .addGap(4, 4, 4)
                .addComponent(apellidoYNombrePersonaDeContacto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(90, Short.MAX_VALUE))
        );

        panelTutor.setBorder(javax.swing.BorderFactory.createTitledBorder(javax.swing.BorderFactory.createTitledBorder("Tutor"), "", javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, Fuente.FUENTE_PANEL_BORDE));
        panelTutor.setForeground(Fuente.COLOR_NORMAL);
        panelTutor.setPreferredSize(new java.awt.Dimension(199, 241));

        textoDocumentoTutor.setFont(Fuente.FUENTE_LABEL);
        textoDocumentoTutor.setText("Documento");

        textoApellidoYNombreTutor.setFont(Fuente.FUENTE_LABEL);
        textoApellidoYNombreTutor.setText("Apellido, Nombre");

        documentoTutor.setFont(Fuente.FUENTE_LABEL);
        documentoTutor.setForeground(Fuente.COLOR_NORMAL);
        documentoTutor.setPreferredSize(new java.awt.Dimension(169, 20));

        apellidoYNombreTutor.setFont(Fuente.FUENTE_LABEL);
        apellidoYNombreTutor.setForeground(Fuente.COLOR_NORMAL);
        apellidoYNombreTutor.setPreferredSize(new java.awt.Dimension(169, 20));

        javax.swing.GroupLayout panelTutorLayout = new javax.swing.GroupLayout(panelTutor);
        panelTutor.setLayout(panelTutorLayout);
        panelTutorLayout.setHorizontalGroup(
            panelTutorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelTutorLayout.createSequentialGroup()
                .addGroup(panelTutorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(textoApellidoYNombreTutor)
                    .addComponent(textoDocumentoTutor)
                    .addComponent(documentoTutor, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(apellidoYNombreTutor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );
        panelTutorLayout.setVerticalGroup(
            panelTutorLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelTutorLayout.createSequentialGroup()
                .addComponent(textoDocumentoTutor)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(documentoTutor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(11, 11, 11)
                .addComponent(textoApellidoYNombreTutor)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(apellidoYNombreTutor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(140, Short.MAX_VALUE))
        );

        botonSeleccionarPersonaDeContacto.setFont(Fuente.FUENTE_BOTON_INTERNO);
        botonSeleccionarPersonaDeContacto.setForeground(Fuente.COLOR_NORMAL);
        botonSeleccionarPersonaDeContacto.setIcon(Icono.ICONO_16_IZQUIERDA);
        botonSeleccionarPersonaDeContacto.setToolTipText("Asocia la persona seleccionada como persona de contacto");
        botonSeleccionarPersonaDeContacto.setEnabled(false);
        botonSeleccionarPersonaDeContacto.setPreferredSize(new java.awt.Dimension(42, 23));
        botonSeleccionarPersonaDeContacto.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonSeleccionarPersonaDeContactoActionPerformed(evt);
            }
        });

        botonSeleccionarTutor.setFont(Fuente.FUENTE_BOTON_INTERNO);
        botonSeleccionarTutor.setForeground(Fuente.COLOR_NORMAL);
        botonSeleccionarTutor.setIcon(Icono.ICONO_16_DERECHA);
        botonSeleccionarTutor.setToolTipText("Asocia la persona seleccionada como tutor");
        botonSeleccionarTutor.setEnabled(false);
        botonSeleccionarTutor.setPreferredSize(new java.awt.Dimension(42, 23));
        botonSeleccionarTutor.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonSeleccionarTutorActionPerformed(evt);
            }
        });

        tablaPersonaScrollPanel.setMinimumSize(new java.awt.Dimension(0, 0));
        tablaPersonaScrollPanel.setPreferredSize(new java.awt.Dimension(456, 235));

        tablaPersona.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                tablaPersonaMouseClicked(evt);
            }
        });
        tablaPersonaScrollPanel.setViewportView(tablaPersona);
        MiModeloTabla.inicializarTabla(tablaPersona);
        tablaPersona.getTableHeader().setEnabled(false);

        textoFiltrarTablaPersona.setFont(Fuente.FUENTE_LABEL);
        textoFiltrarTablaPersona.setForeground(Fuente.COLOR_NORMAL);
        textoFiltrarTablaPersona.setText("Filtrar");
        textoFiltrarTablaPersona.setPreferredSize(new java.awt.Dimension(28, 20));

        filtrarTablaPersona.setFont(Fuente.FUENTE_TEXTFIELD);
        filtrarTablaPersona.setForeground(Fuente.COLOR_NORMAL);
        filtrarTablaPersona.setToolTipText("Filtra los datos encontrados por algún criterio");
        filtrarTablaPersona.setPreferredSize(new java.awt.Dimension(200, 20));
        filtrarTablaPersona.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                filtrarTablaPersonaKeyReleased(evt);
            }
        });

        botonAgregarPersona.setFont(Fuente.FUENTE_BOTON_INTERNO);
        botonAgregarPersona.setForeground(Fuente.COLOR_NORMAL);
        botonAgregarPersona.setIcon(Icono.ICONO_16_AGREGAR);
        botonAgregarPersona.setText("Agregar persona");
        botonAgregarPersona.setToolTipText("Agrega una persona");
        botonAgregarPersona.setPreferredSize(new java.awt.Dimension(175, 20));
        botonAgregarPersona.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonAgregarPersonaActionPerformed(evt);
            }
        });

        textoDescriptivoPanelContacto.setFont(Fuente.FUENTE_TITULO_3);
        textoDescriptivoPanelContacto.setForeground(Fuente.COLOR_NORMAL);
        textoDescriptivoPanelContacto.setText("Seleccione la persona de contacto y/o tutor de la lista");
        textoDescriptivoPanelContacto.setPreferredSize(new java.awt.Dimension(496, 20));

        javax.swing.GroupLayout panelPersonaResponsableLayout = new javax.swing.GroupLayout(panelPersonaResponsable);
        panelPersonaResponsable.setLayout(panelPersonaResponsableLayout);
        panelPersonaResponsableLayout.setHorizontalGroup(
            panelPersonaResponsableLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelPersonaResponsableLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelPersonaResponsableLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelPersonaResponsableLayout.createSequentialGroup()
                        .addComponent(panelPersonaDeContacto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(botonSeleccionarPersonaDeContacto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(panelPersonaResponsableLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(panelPersonaResponsableLayout.createSequentialGroup()
                                .addComponent(botonAgregarPersona, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 55, Short.MAX_VALUE)
                                .addComponent(textoFiltrarTablaPersona, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(filtrarTablaPersona, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addComponent(tablaPersonaScrollPanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 462, Short.MAX_VALUE))
                        .addGap(10, 10, 10)
                        .addComponent(botonSeleccionarTutor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(panelTutor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(textoDescriptivoPanelContacto, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 972, Short.MAX_VALUE))
                .addContainerGap())
        );
        panelPersonaResponsableLayout.setVerticalGroup(
            panelPersonaResponsableLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPersonaResponsableLayout.createSequentialGroup()
                .addComponent(textoDescriptivoPanelContacto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(panelPersonaResponsableLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(panelPersonaResponsableLayout.createSequentialGroup()
                        .addGap(102, 102, 102)
                        .addComponent(botonSeleccionarTutor, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(panelPersonaResponsableLayout.createSequentialGroup()
                        .addGap(101, 101, 101)
                        .addComponent(botonSeleccionarPersonaDeContacto, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelPersonaResponsableLayout.createSequentialGroup()
                        .addGroup(panelPersonaResponsableLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(botonAgregarPersona, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(filtrarTablaPersona, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(textoFiltrarTablaPersona, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(tablaPersonaScrollPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 240, Short.MAX_VALUE))
                    .addComponent(panelPersonaDeContacto, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 266, Short.MAX_VALUE)
                    .addComponent(panelTutor, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, 266, Short.MAX_VALUE)))
        );

        botonReasignar.setFont(Fuente.FUENTE_BOTON_EXTERNO);
        botonReasignar.setForeground(Fuente.COLOR_NORMAL);
        botonReasignar.setIcon(Icono.ICONO_16_ACEPTAR);
        botonReasignar.setText("Reasignar");
        botonReasignar.setToolTipText("Reasigne las nuevas personas de contacto y/o tutores a los pacientes maniulados");
        botonReasignar.setPreferredSize(new java.awt.Dimension(110, 23));
        botonReasignar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonReasignarActionPerformed(evt);
            }
        });

        botonCancelar.setFont(Fuente.FUENTE_BOTON_EXTERNO);
        botonCancelar.setForeground(Fuente.COLOR_NORMAL);
        botonCancelar.setIcon(Icono.ICONO_16_CANCELAR);
        botonCancelar.setText("Cancelar");
        botonCancelar.setToolTipText("Cancela la operación");
        botonCancelar.setPreferredSize(new java.awt.Dimension(110, 23));
        botonCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonCancelarActionPerformed(evt);
            }
        });

        textoDescriptivoVentana.setFont(Fuente.FUENTE_TITULO_2);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(panelPacientesAfectados, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(textoDescriptivoVentana, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 1004, Short.MAX_VALUE)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(botonReasignar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(botonCancelar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addComponent(panelPersonaResponsable, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(textoDescriptivoVentana, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelPacientesAfectados, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(panelPersonaResponsable, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(botonCancelar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonReasignar, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void filtrarTablaPacienteKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_filtrarTablaPacienteKeyReleased
        TableRowSorter<MiModeloTabla> sorter = new TableRowSorter<MiModeloTabla>(
                (MiModeloTabla) tablaPaciente.getModel());
        tablaPaciente.setRowSorter(sorter);

        String texto = filtrarTablaPaciente.getText();
        if (texto.length() == 0) {
            sorter.setRowFilter(null);
        } else {
            sorter.setRowFilter(RowFilter.regexFilter("(?i).*" + texto + ".*"));
        }
}//GEN-LAST:event_filtrarTablaPacienteKeyReleased

    private void botonSeleccionarPersonaDeContactoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonSeleccionarPersonaDeContactoActionPerformed
        int seleccion[] = tablaPersona.getSelectedRows();

        if(botonSeleccionarPersonaDeContacto.getIcon().equals(Icono.ICONO_16_IZQUIERDA) &&
                seleccion.length != 0){
            //Carga el panel según la persona seleccionada en la tablaPersona
            cargarDatosPanelPersonaDeContacto(-2);
            cargarPersonaDeContactoEnMatriz(false);
        } else if (botonSeleccionarPersonaDeContacto.getIcon().equals(Icono.ICONO_16_DERECHA)) {
            quitarDatosPanelPersonaDeContacto();
            quitarPersonaDeContactoEnMatriz();
            invertirBoton(botonSeleccionarPersonaDeContacto);
        }
        
    }//GEN-LAST:event_botonSeleccionarPersonaDeContactoActionPerformed

    private void botonSeleccionarTutorActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonSeleccionarTutorActionPerformed
        int seleccion[] = tablaPersona.getSelectedRows();

        if(botonSeleccionarTutor.getIcon().equals(Icono.ICONO_16_DERECHA) &&
                seleccion.length != 0){
            //Carga el panel según la persona seleccionada en la tablaPersona
            cargarDatosPanelTutor(-2);
            cargarTutorEnMatriz();
        } else if (botonSeleccionarTutor.getIcon().equals(Icono.ICONO_16_IZQUIERDA)) {
            quitarDatosPanelTutor();
            quitarTutorEnMatriz();
            invertirBoton(botonSeleccionarTutor);
        }
}//GEN-LAST:event_botonSeleccionarTutorActionPerformed

    /**
     * Invierte la leyenda del botón.
     *
     * @param boton El componente boton
     * @return El botón invertido
     */
    public static void invertirBoton(JButton boton) {
        if (boton.getIcon().equals(Icono.ICONO_16_IZQUIERDA)) {
            boton.setIcon(Icono.ICONO_16_DERECHA);
        } else {
            boton.setIcon(Icono.ICONO_16_IZQUIERDA);
        }
    }

    private void filtrarTablaPersonaKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_filtrarTablaPersonaKeyReleased
        TableRowSorter<MiModeloTabla> sorter = new TableRowSorter<MiModeloTabla>(
                (MiModeloTabla) tablaPersona.getModel());
        tablaPersona.setRowSorter(sorter);

        String texto = filtrarTablaPersona.getText();
        if (texto.length() == 0) {
            sorter.setRowFilter(null);
        } else {
            sorter.setRowFilter(RowFilter.regexFilter("(?i).*" + texto + ".*"));
        }
}//GEN-LAST:event_filtrarTablaPersonaKeyReleased

    private void botonAgregarPersonaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonAgregarPersonaActionPerformed
        ComunPersonaPresentacion.agregarPersona(tablaPersona, tablaPersonaScrollPanel);
}//GEN-LAST:event_botonAgregarPersonaActionPerformed

    private void botonReasignarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonReasignarActionPerformed
        if (reasignarContactoAPaciente()) {
            this.dispose();
        }
}//GEN-LAST:event_botonReasignarActionPerformed

    private boolean reasignarContactoAPaciente() {
        //Valida los campos
        if (validarCampos()) {
            if (PacienteLogica.reasignarContactoAPaciente(datosReasigancion)) {
                reasignacionExitosa = true;
                return true;
            } else {
                reasignacionExitosa = false;
                return false;
            }
        } else {
            MensajePresentacion.errorDatosInvalidos();
            informarErrores();
            reasignacionExitosa = false;
            return false;
        }
    }

    /**
     * Valida los campos ingresados.
     * 
     * @return true si son válidos, false en caso contrario
     */
    private boolean validarCampos() {
        boolean retornoPersonaDeContacto = false;
        boolean retornoTutor = false;
        //Inicia el campo de validacion de la matriz
        for (int i = 0; i < datosReasigancion.length; i++) {
            datosReasigancion
                    [i][CapaLogica.REASIGNACION_CONTACTO_ES_VALIDO] = "true";
        }

        filasAPintar = new Vector<Integer>();
        retornoPersonaDeContacto = validarCamposPersonaDeContacto();
        retornoTutor = validarCamposTutor();

        tablaPaciente.setDefaultRenderer(Object.class,
                new CustomRenderer(filasAPintar));
        tablaPaciente.repaint();
        tablaPaciente.revalidate();

        return retornoPersonaDeContacto && retornoTutor;
    }

    /**
     * Valida los campos correspondiente a la persona de contacto.
     *
     * @return true si son válidos, false en caso contrario
     */
    private boolean validarCamposPersonaDeContacto() {
        boolean retorno = true;
        for (int i = 0; i < datosReasigancion.length; i++) {
            Paciente temporal = PacienteLogica.getPacientePorId(
                    ((Paciente) datosReasigancion[i][
                    CapaLogica.REASIGNACION_CONTACTO_OBJETO_PACIENTE]).
                    getIdPaciente());

            //Si tenia persona de contacto debería haber habido reasignación
            if (temporal.getPersonaDeContacto() != null &&
                    personaAModificar.getIdPersona() ==
                    temporal.getPersonaDeContacto().getPersona().getIdPersona()) {
                if ((datosReasigancion[i][
                        CapaLogica.REASIGNACION_CONTACTO_VINCULO_PERSONA_DE_CONTACTO].
                        toString().equals("") ||
                        datosReasigancion[i][
                        CapaLogica.REASIGNACION_CONTACTO_OBJETO_PERSONA_DE_CONTACTO] ==
                        null)) {
                    datosReasigancion[i][CapaLogica.REASIGNACION_CONTACTO_ES_VALIDO] =
                            "false";
                    filasAPintar.add(i);
                    retorno = false;
                }
            }
        }
        return retorno;
    }

    /**
     * Valida los campos correspondiente al tutor.
     *
     * @return true si son válidos, false en caso contrario
     */
    private boolean validarCamposTutor() {
        boolean retorno = true;
        for (int i = 0; i < datosReasigancion.length; i++) {
                Paciente temporal = PacienteLogica.getPacientePorId(
                        ((Paciente) datosReasigancion[i][CapaLogica.REASIGNACION_CONTACTO_OBJETO_PACIENTE]).getIdPaciente());
                //Si tenía tutor debería haber habido reasignación
                if (temporal.getTutor() != null
                        && personaAModificar.getIdPersona() == temporal.getTutor().getPersona().getIdPersona()) {
                    if (datosReasigancion[i][
                            CapaLogica.REASIGNACION_CONTACTO_OBJETO_TUTOR] == null) {
                        datosReasigancion[i][CapaLogica.REASIGNACION_CONTACTO_ES_VALIDO] =
                                "false";
                        filasAPintar.add(i);
                        retorno = false;
                    }
                }
        }

        return retorno;
    }

    /**
     * Informa acerca de los errores encontrados en el ingreso de datos.
     *
     * @param i El índice de la fila seleccionada en la tabla paciente
     */
    private void informarErrores() {
        int[] seleccion = tablaPaciente.getSelectedRows();
        int i = -1;
        if (seleccion.length != 0) {
            i = seleccion[0];
            //Si el paciente seleccionado contiene errores de ingreso

            textoVinculoPersonaDeContacto.setForeground(Fuente.COLOR_NORMAL);
            textoVinculoPersonaDeContacto.setToolTipText(null);
            textoDocumentoPersonaDeContacto.setForeground(Fuente.COLOR_NORMAL);
            textoDocumentoPersonaDeContacto.setToolTipText(null);
            textoApellidoYNombrePersonaDeContacto.setForeground(Fuente.COLOR_NORMAL);
            textoApellidoYNombrePersonaDeContacto.setToolTipText(null);
            textoDocumentoTutor.setForeground(Fuente.COLOR_NORMAL);
            textoDocumentoTutor.setToolTipText(null);
            textoApellidoYNombreTutor.setForeground(Fuente.COLOR_NORMAL);
            textoApellidoYNombreTutor.setToolTipText(null);

            if (datosReasigancion[i][
                    CapaLogica.REASIGNACION_CONTACTO_ES_VALIDO].equals("false")) {
                //Persona de contacto
                if (botonSeleccionarPersonaDeContacto.isEnabled() &&
                        !documentoPersonaDeContacto.getText().isEmpty()) {
                    if (vinculoPersonaDeContacto.getSelectedItem().toString().isEmpty()) {
                        textoVinculoPersonaDeContacto.setForeground(
                                Fuente.COLOR_ERROR);
                        textoVinculoPersonaDeContacto.setToolTipText(
                                InformeError.INFORME_ERROR_USO_COMUN_PERSONA_DE_CONTACTO_VINCULO);
                        textoDocumentoPersonaDeContacto.setForeground(
                                Fuente.COLOR_NORMAL);
                        textoDocumentoPersonaDeContacto.setToolTipText(null);
                        textoApellidoYNombrePersonaDeContacto.setForeground(
                                Fuente.COLOR_NORMAL);
                        textoApellidoYNombrePersonaDeContacto.setToolTipText(null);
                    } else {
                        textoVinculoPersonaDeContacto.setForeground(
                                Fuente.COLOR_NORMAL);
                        textoVinculoPersonaDeContacto.setToolTipText(null);
                        textoDocumentoPersonaDeContacto.setForeground(
                                Fuente.COLOR_NORMAL);
                        textoDocumentoPersonaDeContacto.setToolTipText(null);
                        textoApellidoYNombrePersonaDeContacto.setForeground(
                                Fuente.COLOR_NORMAL);
                        textoApellidoYNombrePersonaDeContacto.setToolTipText(null);
                    }
                } else if (botonSeleccionarPersonaDeContacto.isEnabled()
                        && documentoPersonaDeContacto.getText().isEmpty()
                        && vinculoPersonaDeContacto.getSelectedItem().toString().isEmpty()) {
                    textoVinculoPersonaDeContacto.setForeground(
                            Fuente.COLOR_ERROR);
                    textoVinculoPersonaDeContacto.setToolTipText(
                            InformeError.INFORME_ERROR_USO_COMUN_PERSONA_DE_CONTACTO);
                    textoDocumentoPersonaDeContacto.setForeground(
                            Fuente.COLOR_ERROR);
                    textoDocumentoPersonaDeContacto.setToolTipText(InformeError.INFORME_ERROR_USO_COMUN_PERSONA_DE_CONTACTO);
                    textoApellidoYNombrePersonaDeContacto.setForeground(
                            Fuente.COLOR_ERROR);
                    textoApellidoYNombrePersonaDeContacto.setToolTipText(InformeError.INFORME_ERROR_USO_COMUN_PERSONA_DE_CONTACTO);
                } else if (
                        botonSeleccionarPersonaDeContacto.isEnabled()
                        && documentoPersonaDeContacto.getText().isEmpty()
                        && !vinculoPersonaDeContacto.getSelectedItem().toString().isEmpty()) {
                    textoVinculoPersonaDeContacto.setForeground(
                            Fuente.COLOR_NORMAL);
                    textoVinculoPersonaDeContacto.setToolTipText(null);
                    textoDocumentoPersonaDeContacto.setForeground(
                            Fuente.COLOR_ERROR);
                    textoDocumentoPersonaDeContacto.setToolTipText(
                            InformeError.INFORME_ERROR_USO_COMUN_PERSONA_DE_CONTACTO);
                    textoApellidoYNombrePersonaDeContacto.setForeground(
                            Fuente.COLOR_ERROR);
                    textoApellidoYNombrePersonaDeContacto.setToolTipText(
                            InformeError.INFORME_ERROR_USO_COMUN_PERSONA_DE_CONTACTO);
                } else {
                    textoDocumentoPersonaDeContacto.setForeground(Fuente.COLOR_NORMAL);
                    textoDocumentoPersonaDeContacto.setToolTipText(null);
                    textoApellidoYNombrePersonaDeContacto.setForeground(Fuente.COLOR_NORMAL);
                    textoApellidoYNombrePersonaDeContacto.setToolTipText(null);
                }

                //Tutor
                if (botonSeleccionarTutor.isEnabled() &&
                        documentoTutor.getText().isEmpty()) {
                    textoDocumentoTutor.setForeground(
                            Fuente.COLOR_ERROR);
                    textoDocumentoTutor.setToolTipText(InformeError.
                            INFORME_ERROR_USO_COMUN_TUTOR);
                    textoApellidoYNombreTutor.setForeground(
                           Fuente.COLOR_ERROR);
                    textoApellidoYNombreTutor.setToolTipText(InformeError.
                            INFORME_ERROR_USO_COMUN_TUTOR);
                } else {
                    textoDocumentoTutor.setForeground(Fuente.COLOR_NORMAL);
                    textoDocumentoTutor.setToolTipText(null);
                    textoApellidoYNombreTutor.setForeground(Fuente.COLOR_NORMAL);
                    textoApellidoYNombreTutor.setToolTipText(null);
                }
            } else {
                textoVinculoPersonaDeContacto.setForeground(Fuente.COLOR_NORMAL);
                textoVinculoPersonaDeContacto.setToolTipText(null);
                textoDocumentoPersonaDeContacto.setForeground(Fuente.COLOR_NORMAL);
                textoDocumentoPersonaDeContacto.setToolTipText(null);
                textoApellidoYNombrePersonaDeContacto.setForeground(Fuente.COLOR_NORMAL);
                textoApellidoYNombrePersonaDeContacto.setToolTipText(null);
                textoDocumentoTutor.setForeground(Fuente.COLOR_NORMAL);
                textoDocumentoTutor.setToolTipText(null);
                textoApellidoYNombreTutor.setForeground(Fuente.COLOR_NORMAL);
                textoApellidoYNombreTutor.setToolTipText(null);
            }
        }
        this.repaint();
    }

    private void botonCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonCancelarActionPerformed
        reasignacionExitosa = false;
        this.dispose();
}//GEN-LAST:event_botonCancelarActionPerformed

    private void tablaPacienteKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_tablaPacienteKeyReleased
        if (evt.getKeyCode() == KeyEvent.VK_UP ||
                evt.getKeyCode() == KeyEvent.VK_DOWN) {
            eventoCambioDeFila();

        }
    }//GEN-LAST:event_tablaPacienteKeyReleased

    private void tablaPacienteMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tablaPacienteMouseReleased
        eventoCambioDeFila();
    }//GEN-LAST:event_tablaPacienteMouseReleased

    private void vinculoPersonaDeContactoItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_vinculoPersonaDeContactoItemStateChanged
        cargarPersonaDeContactoEnMatriz(true);
    }//GEN-LAST:event_vinculoPersonaDeContactoItemStateChanged

    private void tablaPersonaMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_tablaPersonaMouseClicked
        if (evt.getButton() == 3) {
            PopUpMenu.createPopupMenuPersona(tablaPersona, 
                    tablaPersonaScrollPanel, null);
        }
    }//GEN-LAST:event_tablaPersonaMouseClicked

    /**
     * Cada vez que se selecciona una fila corren ciertos procesos.
     *
     */
    private void eventoCambioDeFila() {
        int[] seleccion = tablaPaciente.getSelectedRows();
        int i = -1;
        if (seleccion.length != 0) {
            i = seleccion[0];
//            i = tablaPaciente.convertRowIndexToModel(i);
            Paciente pacienteSeleccionado = (Paciente)
                    MiModeloTabla.recuperarObjetoDeTabla(
                    Paciente.class.getName(), tablaPaciente);

            //Chequea que contacto se debe reasignar
            manejoSeleccionDePersona(pacienteSeleccionado);

            //Carga los paneles
            cargarDatosPanelPersonaDeContacto(i);
            cargarDatosPanelTutor(i);

            informarErrores();
        }
    }

    /**
     * Habilita o deshabilita los botones para seleccionar persona de contacto
     * y/o tutor.
     *
     * @param pacienteSeleccionado El paciente seleccionado de la tabla de
     * pacientes
     */
    private void manejoSeleccionDePersona(Paciente pacienteSeleccionado) {
        //Persona de contacto
        if (pacienteSeleccionado.getPersonaDeContacto() != null) {
            if (pacienteSeleccionado.getPersonaDeContacto().getPersona().
                    getIdPersona() == personaAModificar.getIdPersona()) {
                botonSeleccionarPersonaDeContacto.setEnabled(true);
                vinculoPersonaDeContacto.setEnabled(true);
            } else {
                botonSeleccionarPersonaDeContacto.setEnabled(false);
                vinculoPersonaDeContacto.setEnabled(false);
            }
        } else {
            botonSeleccionarPersonaDeContacto.setEnabled(false);
            vinculoPersonaDeContacto.setEnabled(false);
        }

        //Tutor
        if (pacienteSeleccionado.getTutor() != null) {
            if (pacienteSeleccionado.getTutor().getPersona().getIdPersona()
                     == personaAModificar.getIdPersona()) {
                botonSeleccionarTutor.setEnabled(true);
            } else {
                botonSeleccionarTutor.setEnabled(false);
            }
        } else {
            botonSeleccionarTutor.setEnabled(false);
        }
    }

     /**
     * Carga los datos en el panel Persona de Contacto
     *
     * @param indice El índice de la fila seleccionada en la tabla paciente
     */
    private void cargarDatosPanelPersonaDeContacto(int indice) {
        if (indice != -2) {
            vinculoPersonaDeContacto.getModel().setSelectedItem(
                    datosReasigancion[indice][CapaLogica.
                    REASIGNACION_CONTACTO_VINCULO_PERSONA_DE_CONTACTO]);
        }

        Persona persona = recuperarPersonaDeContacto(indice);
        if (persona != null) {
            documentoPersonaDeContacto.setText(
                    CapaPresentacion.imprimirDocumento(
                    persona));

            apellidoYNombrePersonaDeContacto.setText(
                    CapaPresentacion.imprimirApellidoYNombrePersona(
                    persona));

            if (botonSeleccionarPersonaDeContacto.getIcon().equals(
                    Icono.ICONO_16_IZQUIERDA)) {
                invertirBoton(botonSeleccionarPersonaDeContacto);
            }
        } else {
            documentoPersonaDeContacto.setText("");
            apellidoYNombrePersonaDeContacto.setText("");

            if (botonSeleccionarPersonaDeContacto.getIcon().equals(
                    Icono.ICONO_16_DERECHA)) {
                invertirBoton(botonSeleccionarPersonaDeContacto);
            }
        }
    }

    /**
     * Recupera la persona a cargar, ya sea por la matriz o por la tabla de
     * persona.
     *
     * @param indice El índice de la fila seleccionada en la tabla paciente
     * @return El objeto Persona de donde cargar
     */
    private Persona recuperarPersonaDeContacto(int indice) {
        Persona personaSeleccionada;
        //Si el indice es igual a -2, se debe recuperar la persona de la tabla persona
        if (indice == -2) {
            personaSeleccionada = (Persona) MiModeloTabla.recuperarObjetoDeTabla(
                    Persona.class.getName(), tablaPersona);
            Paciente pacienteSeleccionado =
                    (Paciente) MiModeloTabla.recuperarObjetoDeTabla(Paciente.class.
                    getName(), tablaPaciente);

            if (pacienteSeleccionado.getPersona().getIdPersona() ==
                    personaSeleccionada.getIdPersona()) {
                MensajePresentacion.informarContactoNoHabilitado();
                personaSeleccionada = null;

            } else if (personaAModificar.getIdPersona() ==
                    personaSeleccionada.getIdPersona()) {
                MensajePresentacion.informarContactoNoHabilitado();
                personaSeleccionada = null;

            } else if (PacienteLogica.getPacientePorPersona(personaSeleccionada) != null &&
                    PacienteLogica.getPacientePorPersona(personaSeleccionada).
                    getFichaMortalidad() != null) {
                MensajePresentacion.informarContactoNoHabilitado();
                personaSeleccionada = null;

            } else if (!CapaLogica.esMenor(personaSeleccionada.getFechaDeNacimientoPersona())) {
                MensajePresentacion.informarContactoNoHabilitado();
                personaSeleccionada = null;
            }
        } else {
            if (datosReasigancion[indice][
                    CapaLogica.REASIGNACION_CONTACTO_OBJETO_PERSONA_DE_CONTACTO] !=
                    null) {
            personaSeleccionada = PersonaLogica.getPersonaPorIdYEnBd(
                    ((Persona) datosReasigancion[indice][
                    CapaLogica.REASIGNACION_CONTACTO_OBJETO_PERSONA_DE_CONTACTO]).
                    getIdPersona());
            } else {
                personaSeleccionada = null;
            }
        }
        return personaSeleccionada;
    }

    /**
     * Carga en la matriz los datos correspondientes a persona de contacto.
     *
     * @param true si solo debe cargarse el vinculo, false si debe cargarse todo
     */
    private void cargarPersonaDeContactoEnMatriz(boolean soloVinculo) {
        //Recupera el indice en donde guardar
        int i = tablaPaciente.getSelectedRows()[0];
        i = tablaPaciente.convertRowIndexToModel(
                i);
        //Guarda los datos
        datosReasigancion[i][
                CapaLogica.REASIGNACION_CONTACTO_VINCULO_PERSONA_DE_CONTACTO] =
                vinculoPersonaDeContacto.getSelectedItem().toString();
        if (!soloVinculo) {
            datosReasigancion[i][
                    CapaLogica.REASIGNACION_CONTACTO_OBJETO_PERSONA_DE_CONTACTO] =
                    MiModeloTabla.recuperarObjetoDeTabla(
                    Persona.class.getName(), tablaPersona);
        }
    }

    /**
     * Carga en la matriz los datos correspondientes a persona de contacto.
     *
     */
    private void quitarPersonaDeContactoEnMatriz() {
        //Recupera el indice en donde guardar
        int i = tablaPaciente.getSelectedRows()[0];
        
        //Guarda los datos
        datosReasigancion[i][
                CapaLogica.REASIGNACION_CONTACTO_VINCULO_PERSONA_DE_CONTACTO] =
                "";

        datosReasigancion[i][
                CapaLogica.REASIGNACION_CONTACTO_OBJETO_PERSONA_DE_CONTACTO] =
                null;
    }

    /**
     * Setea en blanco el panel persona de contacto.
     *
     */
    private void quitarDatosPanelPersonaDeContacto(){
        vinculoPersonaDeContacto.setSelectedIndex(0);
        documentoPersonaDeContacto.setText("");
        apellidoYNombrePersonaDeContacto.setText("");
    }

    /**
     * Carga los datos en el panel Tutor
     *
     * @param indice El índice de la fila seleccionada en la tabla paciente
     */
    private void cargarDatosPanelTutor(int indice) {
        //Recupera los datos
        Persona persona = recuperarTutor(indice);

        if (persona != null) {
            documentoTutor.setText(
                    CapaPresentacion.imprimirDocumento(
                    persona));

            apellidoYNombreTutor.setText(
                    CapaPresentacion.imprimirApellidoYNombrePersona(
                    persona));

            if (botonSeleccionarTutor.getIcon().equals(Icono.ICONO_16_DERECHA)) {
                invertirBoton(botonSeleccionarTutor);
            }
        } else {
            documentoTutor.setText("");
            apellidoYNombreTutor.setText("");

            if (botonSeleccionarTutor.getIcon().equals(Icono.ICONO_16_IZQUIERDA)) {
                invertirBoton(botonSeleccionarTutor);
            }
        }
    }

    /**
     * Recupera la persona a cargar, ya sea por la matriz o por la tabla de
     * persona.
     *
     * @param indice El índice de la fila seleccionada en la tabla paciente
     * @return El objeto Persona de donde cargar
     */
    private Persona recuperarTutor(int indice) {
        Persona personaSeleccionada;
        //Si el indice es igual a -2, se debe recuperar la persona de la tabla persona
        if (indice == -2) {
            personaSeleccionada = (Persona) MiModeloTabla.recuperarObjetoDeTabla(
                    Persona.class.getName(), tablaPersona);
            Paciente pacienteSeleccionado =
                    (Paciente) MiModeloTabla.recuperarObjetoDeTabla(Paciente.class.getName(),
                    tablaPaciente);

            if (pacienteSeleccionado.getPersona().equals(personaSeleccionada)) {
                MensajePresentacion.informarContactoNoHabilitado();
                personaSeleccionada = null;

            } else if (personaAModificar.equals(personaSeleccionada)) {
                MensajePresentacion.informarContactoNoHabilitado();
                personaSeleccionada = null;

            } else if (PacienteLogica.getPacientePorPersona(personaSeleccionada) != null &&
                    PacienteLogica.getPacientePorPersona(personaSeleccionada).
                    getFichaMortalidad() != null) {
                MensajePresentacion.informarContactoNoHabilitado();
                personaSeleccionada = null;

            } else if (!CapaLogica.esMenor(personaSeleccionada.getFechaDeNacimientoPersona())) {
                MensajePresentacion.informarContactoNoHabilitado();
                personaSeleccionada = null;
            }
        } else {
            if (datosReasigancion[indice][
                    CapaLogica.REASIGNACION_CONTACTO_OBJETO_TUTOR] != null) {
            personaSeleccionada = PersonaLogica.getPersonaPorIdYEnBd(
                    ((Persona)datosReasigancion[indice][
                    CapaLogica.REASIGNACION_CONTACTO_OBJETO_TUTOR]).getIdPersona());
            } else {
                personaSeleccionada = null;
            }
        }

        return personaSeleccionada;
    }

    /**
     * Carga en la matriz los datos correspondientes a persona de contacto
     *
     */
    private void cargarTutorEnMatriz() {
        //Recupera el indice en donde guardar
        int i = tablaPaciente.getSelectedRows()[0];

        //Guarda los datos
        datosReasigancion
                [i][CapaLogica.REASIGNACION_CONTACTO_OBJETO_TUTOR] =
                MiModeloTabla.recuperarObjetoDeTabla(Persona.class.getName(),
                tablaPersona);
    }

    /**
     * Carga en la matriz los datos correspondientes a persona de contacto
     *
     */
    private void quitarTutorEnMatriz() {
        //Recupera el indice en donde guardar
        int i = tablaPaciente.getSelectedRows()[0];

        //Guarda los datos
        datosReasigancion
                [i][CapaLogica.REASIGNACION_CONTACTO_OBJETO_TUTOR] =
                null;
    }

    /**
     * Setea en blanco el panel persona de contacto.
     *
     */
    private void quitarDatosPanelTutor(){
        documentoTutor.setText("");
        apellidoYNombreTutor.setText("");
    }

    public static boolean isReasignacionExitosa() {
        return reasignacionExitosa;
    }

    /**
     * Setea en cada componente del JDialog los eventos que capturarán la tecla
     * enter y escape.
     */
    private void setearEventosQueCapturanTeclaEnterYEscape() {
        //Declaración del evento a capturar
        KeyListener keyListenerEscape = new KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                if (evt.getKeyCode() == KeyEvent.VK_ESCAPE) {
                    //Llamada al método que capturará el boton enter y
                    //trabajará sobre el mismo
                    dispose();
                }
            }
        };
        //Setear eventos
        filtrarTablaPaciente.addKeyListener(keyListenerEscape);
        filtrarTablaPaciente.addKeyListener(keyListenerEscape);
        tablaPaciente.addKeyListener(keyListenerEscape);
        tablaPersona.addKeyListener(keyListenerEscape);
        vinculoPersonaDeContacto.addKeyListener(keyListenerEscape);
        botonSeleccionarTutor.addKeyListener(keyListenerEscape);
        botonSeleccionarPersonaDeContacto.addKeyListener(keyListenerEscape);
        botonAgregarPersona.addKeyListener(keyListenerEscape);
        botonCancelar.addKeyListener(keyListenerEscape);
        botonReasignar.addKeyListener(keyListenerEscape);
    }   

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel apellidoYNombrePersonaDeContacto;
    private javax.swing.JLabel apellidoYNombreTutor;
    private javax.swing.JButton botonAgregarPersona;
    private javax.swing.JButton botonCancelar;
    private javax.swing.JButton botonReasignar;
    private javax.swing.JButton botonSeleccionarPersonaDeContacto;
    private javax.swing.JButton botonSeleccionarTutor;
    private javax.swing.JLabel documentoPersonaDeContacto;
    private javax.swing.JLabel documentoTutor;
    private javax.swing.JTextField filtrarTablaPaciente;
    private javax.swing.JTextField filtrarTablaPersona;
    private javax.swing.JPanel panelPacientesAfectados;
    private javax.swing.JPanel panelPersonaDeContacto;
    private javax.swing.JPanel panelPersonaResponsable;
    private javax.swing.JPanel panelTutor;
    private javax.swing.JTable tablaPaciente;
    private javax.swing.JScrollPane tablaPacienteScrollPane;
    private javax.swing.JTable tablaPersona;
    private javax.swing.JScrollPane tablaPersonaScrollPanel;
    private javax.swing.JLabel textoApellidoYNombrePersonaDeContacto;
    private javax.swing.JLabel textoApellidoYNombreTutor;
    private javax.swing.JLabel textoDescriptivoPanelContacto;
    private javax.swing.JLabel textoDescriptivoVentana;
    private javax.swing.JLabel textoDescriptivoVentana1;
    private javax.swing.JLabel textoDocumentoPersonaDeContacto;
    private javax.swing.JLabel textoDocumentoTutor;
    private javax.swing.JLabel textoFiltrarTablaPaciente;
    private javax.swing.JLabel textoFiltrarTablaPersona;
    private javax.swing.JLabel textoVinculoPersonaDeContacto;
    private javax.swing.JComboBox vinculoPersonaDeContacto;
    // End of variables declaration//GEN-END:variables
    private Persona personaAModificar;
    private static boolean reasignacionExitosa;
    private Object[][] datosReasigancion;
    private Vector<Integer> filasAPintar;
}
